package org.ovirt.engine.ui.uicommonweb.models.storage;
import java.util.Collections;
import org.ovirt.engine.core.compat.*;
import org.ovirt.engine.ui.uicompat.*;
import org.ovirt.engine.core.common.businessentities.*;
import org.ovirt.engine.core.common.vdscommands.*;
import org.ovirt.engine.core.common.queries.*;
import org.ovirt.engine.core.common.action.*;
import org.ovirt.engine.ui.frontend.*;
import org.ovirt.engine.ui.uicommonweb.*;
import org.ovirt.engine.ui.uicommonweb.models.*;
import org.ovirt.engine.core.common.*;
import org.ovirt.engine.ui.uicommonweb.validation.*;
import org.ovirt.engine.ui.uicompat.*;
import org.ovirt.engine.core.common.queries.*;
import org.ovirt.engine.core.common.businessentities.*;
import org.ovirt.engine.ui.uicommonweb.*;
import org.ovirt.engine.ui.uicommonweb.models.*;
@SuppressWarnings("unused")
public abstract class SanStorageModel extends SanStorageModelBase
{
private boolean isGrouppedByTarget;
/**
Gets or sets the value determining whether the
items containing target/LUNs or LUN/targets.
*/
public boolean getIsGrouppedByTarget()
{
return isGrouppedByTarget;
}
public void setIsGrouppedByTarget(boolean value)
{
if (isGrouppedByTarget != value)
{
isGrouppedByTarget = value;
IsGrouppedByTargetChanged();
OnPropertyChanged(new PropertyChangedEventArgs("IsGrouppedByTarget"));
}
}
private String getLUNsFailure;
public String getGetLUNsFailure()
{
return getLUNsFailure;
}
public void setGetLUNsFailure(String value)
{
if (!StringHelper.stringsEqual(getLUNsFailure, value))
{
getLUNsFailure = value;
OnPropertyChanged(new PropertyChangedEventArgs("GetLUNsFailure"));
}
}
private java.util.List<LunModel> includedLUNs;
private java.util.ArrayList<SanTargetModel> lastDiscoveredTargets;
private boolean isTargetModelList;
protected SanStorageModel()
{
includedLUNs = new java.util.ArrayList<LunModel>();
lastDiscoveredTargets = new java.util.ArrayList<SanTargetModel>();
InitializeItems(null, null);
}
@Override
protected void PostDiscoverTargets(java.util.ArrayList<SanTargetModel> newItems)
{
super.PostDiscoverTargets(newItems);
InitializeItems(null, newItems);
//Remember all discovered targets.
lastDiscoveredTargets.clear();
lastDiscoveredTargets.addAll(newItems);
}
@Override
protected void Update()
{
lastDiscoveredTargets.clear();
super.Update();
}
@Override
protected void UpdateInternal()
{
super.UpdateInternal();
if (getContainer().getProgress() != null)
{
return;
}
VDS host = (VDS)getContainer().getHost().getSelectedItem();
if (host == null)
{
ProposeDiscover();
return;
}
ClearItems();
InitializeItems(null, null);
getContainer().StartProgress(null);
Frontend.RunQuery(VdcQueryType.GetDeviceList, new GetDeviceListQueryParameters(host.getvds_id(), getType()), new AsyncQuery(this,
new INewAsyncCallback() {
@Override
public void OnSuccess(Object target, Object returnValue) {
SanStorageModel model = (SanStorageModel)target;
VdcQueryReturnValue response = (VdcQueryReturnValue)returnValue;
if (response.getSucceeded())
{
model.ApplyData((java.util.ArrayList<LUNs>)response.getReturnValue(), false);
model.setGetLUNsFailure("");
}
else
{
model.setGetLUNsFailure("Could not retrieve LUNs, please check your storage.");
}
model.getContainer().StopProgress();
}
}, true));
}
private void ClearItems()
{
if (getItems() == null)
{
return;
}
if (getIsGrouppedByTarget())
{
java.util.List<SanTargetModel> items = (java.util.List<SanTargetModel>)getItems();
for (SanTargetModel target : Linq.ToList(items))
{
boolean found = false;
//Ensure remove targets that are not in last dicovered targets list.
if (Linq.FirstOrDefault(lastDiscoveredTargets, new Linq.TargetPredicate(target)) != null)
{
found = true;
}
else
{
//Ensure remove targets that are not contain already included LUNs.
for (LunModel lun : target.getLuns())
{
LunModel foundItem = Linq.FirstOrDefault(includedLUNs, new Linq.LunPredicate(lun));
if (foundItem == null)
{
found = true;
break;
}
}
}
if (!found)
{
items.remove(target);
}
}
}
else
{
java.util.List<LunModel> items = (java.util.List<LunModel>)getItems();
//Ensure remove targets that are not contain already included LUNs.
for (LunModel lun : Linq.ToList(items))
{
LunModel foundItem = Linq.FirstOrDefault(includedLUNs, new Linq.LunPredicate(lun));
if (foundItem == null)
{
items.remove(lun);
}
}
}
}
/**
Creates model items from the provided list of business entities.
*/
public void ApplyData(java.util.List<LUNs> source, boolean isIncluded)
{
java.util.ArrayList<LunModel> newItems = new java.util.ArrayList<LunModel>();
for (LUNs a : source)
{
if (a.getLunType() == getType() || a.getLunType() == StorageType.UNKNOWN)
{
java.util.ArrayList<SanTargetModel> targets = new java.util.ArrayList<SanTargetModel>();
if (a.getLunConnections() != null)
{
for (storage_server_connections b : a.getLunConnections())
{
SanTargetModel tempVar = new SanTargetModel();
tempVar.setAddress(b.getconnection());
tempVar.setPort(b.getport());
tempVar.setName(b.getiqn());
tempVar.setIsSelected(true);
tempVar.setIsLoggedIn(true);
tempVar.setLuns(new ObservableCollection<LunModel>());
SanTargetModel model = tempVar;
model.getLoginCommand().setIsExecutionAllowed(false);
targets.add(model);
}
}
LunModel tempVar2 = new LunModel();
tempVar2.setLunId(a.getLUN_id());
tempVar2.setVendorId(a.getVendorId());
tempVar2.setProductId(a.getProductId());
tempVar2.setSerial(a.getSerial());
tempVar2.setMultipathing(a.getPathCount());
tempVar2.setTargets(targets);
tempVar2.setSize(a.getDeviceSize());
tempVar2.setIsAccessible(a.getAccessible());
tempVar2.setIsIncluded(isIncluded);
tempVar2.setIsSelected(isIncluded);
LunModel lun = tempVar2;
newItems.add(lun);
//Remember included LUNs to prevent their removal while updating items.
if (isIncluded)
{
includedLUNs.add(lun);
}
}
}
InitializeItems(newItems, null);
ProposeDiscover();
}
private void IsGrouppedByTargetChanged()
{
InitializeItems(null, null);
}
/**
Organizes items according to the current groupping flag.
When new items provided takes them in account and add to the Items collection.
*/
private void InitializeItems(java.util.List<LunModel> newLuns, java.util.List<SanTargetModel> newTargets)
{
if (getIsGrouppedByTarget())
{
if (getItems() == null)
{
setItems(new ObservableCollection<SanTargetModel>());
isTargetModelList = true;
}
else
{
//Convert to list of another type as neccessary.
if (!isTargetModelList)
{
setItems(ToTargetModelList((java.util.List<LunModel>)getItems()));
}
}
java.util.ArrayList<SanTargetModel> items = new java.util.ArrayList<SanTargetModel>();
items.addAll((java.util.List<SanTargetModel>)getItems());
//Add new targets.
if (newTargets != null)
{
for (SanTargetModel newItem : newTargets)
{
if (Linq.FirstOrDefault(items, new Linq.TargetPredicate(newItem)) == null)
{
items.add(newItem);
}
}
}
//Merge luns into targets.
if (newLuns != null)
{
MergeLunsToTargets(newLuns, items);
}
setItems(items);
UpdateLoginAllAvailability();
}
else
{
if (getItems() == null)
{
setItems(new ObservableCollection<LunModel>());
isTargetModelList = false;
}
else
{
//Convert to list of another type as neccessary.
if (isTargetModelList)
{
setItems(ToLunModelList((java.util.List<SanTargetModel>)getItems()));
}
}
java.util.ArrayList<LunModel> items = new java.util.ArrayList<LunModel>();
items.addAll((java.util.List<LunModel>)getItems());
//Add new LUNs.
if (newLuns != null)
{
for (LunModel newItem : newLuns)
{
if (Linq.FirstOrDefault(items, new Linq.LunPredicate(newItem)) == null)
{
items.add(newItem);
}
}
}
setItems(items);
}
}
private void MergeLunsToTargets(java.util.List<LunModel> newLuns, java.util.List<SanTargetModel> targets)
{
for (LunModel lun : newLuns)
{
for (SanTargetModel target : lun.getTargets())
{
SanTargetModel item = Linq.FirstOrDefault(targets, new Linq.TargetPredicate(target));
if (item == null)
{
item = target;
targets.add(item);
}
if (Linq.FirstOrDefault(item.getLuns(), new Linq.LunPredicate(lun)) == null)
{
item.getLuns().add(lun);
}
}
}
}
private java.util.List<SanTargetModel> ToTargetModelList(java.util.List<LunModel> source)
{
ObservableCollection<SanTargetModel> list = new ObservableCollection<SanTargetModel>();
for (LunModel lun : source)
{
for (SanTargetModel target : lun.getTargets())
{
SanTargetModel item = Linq.FirstOrDefault(list, new Linq.TargetPredicate(target));
if (item == null)
{
item = target;
list.add(item);
}
if (Linq.FirstOrDefault(item.getLuns(), new Linq.LunPredicate(lun)) == null)
{
item.getLuns().add(lun);
}
}
}
//Merge with last discovered targets list.
for (SanTargetModel target : lastDiscoveredTargets)
{
if (Linq.FirstOrDefault(list, new Linq.TargetPredicate(target)) == null)
{
list.add(target);
}
}
isTargetModelList = true;
return list;
}
private java.util.List<LunModel> ToLunModelList(java.util.List<SanTargetModel> source)
{
ObservableCollection<LunModel> list = new ObservableCollection<LunModel>();
for (SanTargetModel target : source)
{
for (LunModel lun : target.getLuns())
{
LunModel item = Linq.FirstOrDefault(list, new Linq.LunPredicate(lun));
if (item == null)
{
item = lun;
list.add(item);
}
if (Linq.FirstOrDefault(item.getTargets(), new Linq.TargetPredicate(target)) == null)
{
item.getTargets().add(target);
}
}
}
isTargetModelList = false;
return list;
}
private void ProposeDiscover()
{
if (!getProposeDiscoverTargets() && (getItems() == null || Linq.Count(getItems()) == 0))
{
setProposeDiscoverTargets(true);
}
}
protected void IsAllLunsSelectedChanged()
{
if (!getIsGrouppedByTarget())
{
java.util.List<LunModel> items = (java.util.List<LunModel>)getItems();
for (LunModel lun : items)
{
if (!lun.getIsIncluded() && lun.getIsAccessible())
{
lun.setIsSelected(getIsAllLunsSelected());
}
}
}
}
public java.util.ArrayList<LunModel> getAddedLuns()
{
java.util.ArrayList<LunModel> luns = new java.util.ArrayList<LunModel>();
if (getIsGrouppedByTarget())
{
java.util.List<SanTargetModel> items = (java.util.List<SanTargetModel>)getItems();
for (SanTargetModel item : items)
{
for (LunModel lun : item.getLuns())
{
if (lun.getIsSelected() && !lun.getIsIncluded() && Linq.FirstOrDefault(luns, new Linq.LunPredicate(lun)) == null)
{
luns.add(lun);
}
}
}
}
else
{
java.util.List<LunModel> items = (java.util.List<LunModel>)getItems();
for (LunModel lun : items)
{
if (lun.getIsSelected() && !lun.getIsIncluded() && Linq.FirstOrDefault(luns, new Linq.LunPredicate(lun)) == null)
{
luns.add(lun);
}
}
}
return luns;
}
@Override
public boolean Validate()
{
boolean isValid = getAddedLuns().size() > 0 || includedLUNs.size() > 0;
if (!isValid)
{
getInvalidityReasons().add("No LUNs selected. Please select LUNs.");
}
setIsValid(isValid);
return super.Validate() && getIsValid();
}
}